package com.lzh.others.basejava.Thread_21.common;

/**
 * @Classname SelfManaged
 * @Description 自管理的Runnable
 *  通过这种实现方式，可以继承另一个不同的类，而从Thread继承就不可以这样
 *  注意：在构造器中启动线程可能会有问题，因为另一个任务可能会在构造器结束之前开始执行。这意味着
 *  该任务可能会访问到处于不稳定状态的对象。
 *  所以优先使用Executor 而不是显示的创建Thread对象
 * @Date 2021/9/15 11:26
 * @Created by liuzihao
 */
public class SelfManaged implements Runnable {

    private int countDown = 5;
    private Thread thread = new Thread(this);

    public SelfManaged() {
        thread.start();
    }

    @Override
    public String toString() {
        return Thread.currentThread().getName() + "(" + countDown + "), ";
    }

    @Override
    public void run() {
        while (true){
            //this 默认会调用toString
            //想知道内存地址可以通过super.toString()获得内存地址
            System.out.println(super.toString());
            System.out.println(this);
            if (--countDown == 0){
                return;
            }
        }
    }

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            new SelfManaged();
        }
    }
}
